https://mp.weixin.qq.com/s/T0mL7P-4m-TnbUg54mj9eg
<!-- XSS -->
XSS 攻击是一种代码注入攻击，通过恶意注入脚本在浏览器运行，然后盗取用户信息。
本质上其实是因为网站没有过滤恶意代码，与正常代码混在一起之后，浏览器没有办法分辨哪些是可信的，然后导致恶意代码也被执行

结果是可能会导致：页面数据或用户信息被窃取、伪造登录窗口或在页面生成浮窗广告、监听键盘事件窃取账号密码、流量被支持到其他网站等

<!-- XSS 攻击有三种类型： -->
存储型：通过输入框把恶意代码提交到网站数据库中，然后比如在显示评论的页面就会从数据获取，并直接执行

反射型：和存储型不同的是不会储存在服务器里。比如打开包含带恶意脚本的链接，当打开后会向服务器请求后，
服务器会获取URL中的数据然后拼接在HTML上返回，然后执行

基于DOM型：是通过一些劫持手段，在页面资源传输过程中劫持并修改页面的数据，插入恶意代码
<!-- 防范： -->
比如对输入框内容进行过滤和用转义符进行转码、添加白名单、关闭 Cookie 访问权限、使用验证码防止脚本伪装成用户执行操作等

<!-- CSRF -->

CSRF 就是跨站请求伪造攻击，主要就是利用用户的登录状态发起跨站请求

比如邮箱里的乱七八糟的链接，打开链接的时候邮箱肯定是处于登录状态，然后黑客就可以用这个登录状态，
伪造带有正确 Cookie 的 http 请求，直接绕过后台的登录验证，然后冒充用户执行一些操作，
本质是利用 Cookie 在同源请求中携带发送给服务器的特点，来实现冒充用户

<!-- 发起 CSRF 攻击有几个必要条件： -->

目标网站一定要有 CSRF 漏洞
用户登录过目标网站，并且浏览器保存了登录状态
需要用户主动打开第三方站点

<!-- CSRF 攻击也有三种类型：-->
自动发GET类型：比如img或iframe标签等，当用户打开这个网站时会自动发起带 Cookie 的资源请求
自动发POST类型：比如整一个隐藏的表单，在用户进入页面的时候自动提交表单
诱导链接型：就是诱导用户主动点击链接，比如a标签
防范：比如 Token 验证、双重 Cookie、通过 origin/referer 验证请求来源等

<!-- X-Frame-Options -->
X-Frame-Options 是用于控制当前页面是否可以被嵌入到 iframe 中，以防盗链及点击劫持攻击

X-Frame-Options 设置须添加在请求头中，如下
X-Frame-Options: DENY
参数：

DENY: 不允许，同域名嵌套也不行
SAMEORIGIN: 允许同域名嵌套
ALLOW_FORM url: 可以指定允许嵌套访问的来源
设置 X-Frame-Options 后，可以确保我们的网站没有被嵌入到别人的站点里去
（以防内容被恶意嵌套，并且在表面加一个透明层，诱导用户点击)，从而避免点击劫持攻击及恶意盗链


<!-- https -->
http 是明文传输，是不安全的，所以在 http 传输过程中信息可能被窃取、伪造、篡改，这种攻击方式被称为中间人攻击
避免中间人攻击的方法就是用 https，在应用层与传输层之间添加一个安全层 SSL/TLS，但也不是就绝对安全了

安全层会通过加密算法和公钥私钥加密传递的数据，好处是即使被劫持，
中间人没有私钥就拿不到加密生成的随机数，就无法生成最终密钥

但问题是：假如一开始就被 DNS 劫持，或者说域名劫持攻击，拿到的公钥就是中间人的，
中间人解密拿到数据后，再请求实际服务器，拿到服务器公钥，再把信息发给服务器，这样不知不觉间信息还是会被窃取

这时候就需要CA数字证书，服务器把数字证书发送给浏览器，

<!-- SRI -->
SRI 指子资源完整性，该方案的作用是确保我们站点的资源文件永远不会被改变，如果被改变，浏览器会拒绝执行

比如我们打包的时候有一个 xxx.js 文件，被 index.html 引用，并上传 CDN，
用户在访问的时候，会去请求 xxx.js，而这个文件可能被劫持篡改，或者由于网络等原因，
接收到的文件不完整，怎么办？

而设置了 SRI 就可以确保当请求的文件被篡改或不完整的时候就拒绝执行该文件，设置如下：

<link href="https://xxx/x.css" intergrity="sha1/asdhfkjasdf">
<script src="https://xxx/x.js" intergrity="sha1/asdhfkjasdf"></script>
标签上的 intergrity 属性值的格式是：哈希算法/base64后的哈希值
<!-- 原理： -->
打包的时候会根据文件内容生成 hash，并且把 hash 作为 intergrity 属性注入到标签上，
客户端接收到文件后，根据文件内容生成 hash 与 intergrity 上的进行对比是否一致，
如果不一致就会认为是不安全的，拒绝执行
